{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Logistic 回归——Pima Indians Diabetes Data Set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据说明：\n",
    "Pima Indians Diabetes Data Set（皮马印第安人糖尿病数据集） 根据现有的医疗信息预测5年内皮马印第安人糖尿病发作的概率。   \n",
    "\n",
    "数据集共9个字段: \n",
    "0列为怀孕次数；\n",
    "1列为口服葡萄糖耐量试验中2小时后的血浆葡萄糖浓度；\n",
    "2列为舒张压（单位:mm Hg）\n",
    "3列为三头肌皮褶厚度（单位：mm）\n",
    "4列为餐后血清胰岛素（单位:mm）\n",
    "5列为体重指数（体重（公斤）/ 身高（米）^2）\n",
    "6列为糖尿病家系作用\n",
    "7列为年龄\n",
    "8列为分类变量（0或1）\n",
    "\n",
    "数据链接：https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入必要包\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from matplotlib import pyplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148.0</td>\n",
       "      <td>72.0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183.0</td>\n",
       "      <td>64.0</td>\n",
       "      <td>29.0</td>\n",
       "      <td>125.0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>23.0</td>\n",
       "      <td>94.0</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>168.0</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6    148.0           72.0           35.0    125.0  33.6   \n",
       "1            1     85.0           66.0           29.0    125.0  26.6   \n",
       "2            8    183.0           64.0           29.0    125.0  23.3   \n",
       "3            1     89.0           66.0           23.0     94.0  28.1   \n",
       "4            0    137.0           40.0           35.0    168.0  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "train = pd.read_csv(\"FE_diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null float64\n",
      "BloodPressure               768 non-null float64\n",
      "SkinThickness               768 non-null float64\n",
      "Insulin                     768 non-null float64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(6), int64(3)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 取值\n",
    "y_train = train['Outcome']\n",
    "X_train = train.drop([\"Outcome\"],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "#初始化标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "#对训练数据特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练\n",
    "### default Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "lr = LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is ; [0.48797856 0.53011593 0.4562292  0.422546   0.48392885]\n",
      "cv logloss is : 0.47615970944434044\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证\n",
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr,X_train,y_train,cv = 5,scoring = 'neg_log_loss')\n",
    "print 'logloss of each fold is ;',-loss\n",
    "print 'cv logloss is :',-loss.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 正则化的 Logistic Regression及参数调优\n",
    "logistic回归的需要调整超参数有：C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "目标函数为：J = C* sum(logloss(f(xi), yi)) +  penalty "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.01,0.1,1,10,100,1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty,tuned_parameters,cv = 5,scoring = 'neg_log_loss')\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[mean: -0.69315, std: 0.00000, params: {'penalty': 'l1', 'C': 0.001}, mean: -0.62767, std: 0.00489, params: {'penalty': 'l2', 'C': 0.001}, mean: -0.63598, std: 0.00479, params: {'penalty': 'l1', 'C': 0.01}, mean: -0.51497, std: 0.01870, params: {'penalty': 'l2', 'C': 0.01}, mean: -0.47857, std: 0.03093, params: {'penalty': 'l1', 'C': 0.1}, mean: -0.47681, std: 0.03155, params: {'penalty': 'l2', 'C': 0.1}, mean: -0.47603, std: 0.03561, params: {'penalty': 'l1', 'C': 1}, mean: -0.47622, std: 0.03573, params: {'penalty': 'l2', 'C': 1}, mean: -0.47647, std: 0.03630, params: {'penalty': 'l1', 'C': 10}, mean: -0.47650, std: 0.03632, params: {'penalty': 'l2', 'C': 10}, mean: -0.47653, std: 0.03637, params: {'penalty': 'l1', 'C': 100}, mean: -0.47653, std: 0.03638, params: {'penalty': 'l2', 'C': 100}, mean: -0.47654, std: 0.03638, params: {'penalty': 'l1', 'C': 1000}, mean: -0.47654, std: 0.03638, params: {'penalty': 'l2', 'C': 1000}]\n",
      "0.47602846212313077\n",
      "{'penalty': 'l1', 'C': 1}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\AI\\Environment\\Anaconda2\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "# 查看模型信息\n",
    "print(grid.grid_scores_)\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# CV误差曲线\n",
    "test_means = -grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "train_means = -grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n",
    "\n",
    "#result\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "\n",
    "#print('Cs :',Cs)\n",
    "#print('penaltys :',penaltys)\n",
    "#print('n_Cs :',n_Cs)\n",
    "#print('number_penaltys :',number_penaltys)\n",
    "#print('x_axis :',x_axis)\n",
    "\n",
    "for i, value in enumerate(penaltys):\n",
    "    pyplot.errorbar(x_axis,test_scores[:,i],yerr = test_stds[:,i],label = penaltys[i] + 'Test')\n",
    "    pyplot.errorbar(x_axis,train_scores[:,i],yerr = train_stds[:,i],label = penaltys[i] + 'Train')\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('logloss')\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png')\n",
    "pyplot.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正确率做评价指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7747395833333334\n",
      "{'penalty': 'l2', 'C': 0.1}\n"
     ]
    }
   ],
   "source": [
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001,0.01,0.1,1,10,100,1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "\n",
    "#缺省scoring为正确率\n",
    "grid = GridSearchCV(lr_penalty, tuned_parameters,cv = 5)\n",
    "grid.fit(X_train,y_train)\n",
    "\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xl8VeW1//HPSkgI8xAGmQkQVFAGjeA8DzhUxKEFq6120P5avba9zm3V0mqrtvW2t957pdZarVURHFCpqMV5YFCZEgYZBAIIYSYECEnW7499goeQkEOSnX2SfN+v13lx9j7P3mdtas/iWc/ez2PujoiIyMGkRB2AiIgkPyULERGplpKFiIhUS8lCRESqpWQhIiLVUrIQEZFqhZoszGyUmS02s6Vmdnsln/c2s7fM7DMzm2dmF8R9dkfsuMVmdl6YcYqIyMFZWM9ZmFkqsAQ4B8gHZgHj3D0vrs0E4DN3/18zGwRMdfe+sfdPAyOA7sCbwEB3Lw0lWBEROagwexYjgKXuvtzdi4FngNEV2jjQNva+HbA29n408Iy773H3FcDS2PlERCQCzUI8dw9gddx2PjCyQpt7gNfN7EagFXB23LEfVzi2x8G+rFOnTt63b99ahCsi0vR88sknG929c3XtwkwWVsm+ijWvccDj7v57MzsBeNLMjkrwWMzsOuA6gN69ezN79uxahiwi0rSY2cpE2oVZhsoHesVt9+SrMlO57wITAdz9IyAD6JTgsbj7BHfPcfeczp2rTYwiIlJDYSaLWUC2mWWZWTowFphSoc0q4CwAMzuSIFkUxNqNNbPmZpYFZAMzQ4xVREQOIrQylLuXmNkNwDQgFXjM3XPNbDww292nAP8J/MXMfkJQZrrGg9uzcs1sIpAHlAA/0p1QIiLRCe3W2fqWk5PjGrMQkcrs3buX/Px8du/eHXUokcnIyKBnz56kpaXtt9/MPnH3nOqOD3OAW0QkKeTn59OmTRv69u2LWWX3zzRu7s6mTZvIz88nKyurRufQdB8i0ujt3r2bzMzMJpkoAMyMzMzMWvWslCxEpEloqomiXG2vX8lCRKQS33jkI77xyEdRh5E0lCwak79dGLwag8Z0LSJA69at970fNWoU7du356KLLtq3b8yYMQwbNowBAwbQrl07hg0bxrBhw/jwww8P6XumT5/Oxx9/XH3DQ6QBbhGRenbLLbdQVFTEI488sm/fCy+8AMDbb7/N7373O1555ZUanXv69Ol06tSJ448/vk5iLaeehYhIPTvrrLNo06ZNwu1nzZrFaaedxrHHHsv555/P+vXrAXjooYcYNGgQQ4cO5aqrrmLZsmU8+uijPPjggzXqlRyMehYi0qT88uVc8tZur7Zd3rqgTSLjFoO6t+Xurw2udWyV2bNnDzfddBNTpkyhU6dOPPXUU/ziF79gwoQJPPDAA6xcuZL09HS2bt1K+/bt+d73vkenTp348Y9/XKdxKFmIhK187OXaV6ONow7k3ncyAIPvfD/iSGqnrLgIgJT0lhFHUr2FCxeSm5vL2WcHk3KXlpbSs2dPAAYPHsy4y0dz0Xln8vVrfhhqHEoWIiHLXbcNgHD+3SmH6u6vDWbXulQAWnQ7osp25T2KZ68/oV7iqoq7M2TIEN57770DPps2bRqvP/8kr0ybzgN/zmHBggWhxaExCxGRJDZo0CDWrFnDzJnBXKrFxcXk5uZSWlpKfn4+p598PPf94mYKCgooKiqiTZs27Nixo87jULIQEalnp5xyCldccQX//ve/6dmzJ9OmTauybfPmzZk0aRI//elPGTp0KMOHD2fGjBmUlJRw5ZVXMuKs0Zx43mXcdttttGnThtGjRzNx4kSGDx+uAW4RkYamsLBw3/vKSkrlTj/9dE4//fT99h1zzDG8//6B40QffPABu9YtAr4qqR1xxBHMnz+/DiLen5KFiEgloh6rSDYqQ4mISLWULEREpFpKFiIiUi0lCxERqZaShYhIZTTz8X5CTRZmNsrMFpvZUjO7vZLPHzKzObHXEjPbGvfZA2aWa2YLzexP1tRXLhGRBq18ivI5c+ZwwgknMHjwYIYMGcKzzz4LNOEpys0sFXgYOAfIB2aZ2RR3zytv4+4/iWt/IzA89v5E4CRgSOzj94HTgLfDildEpD60bNmSJ554guzsbNauXcuxxx7Leeed16SnKB8BLHX35e5eDDwDjD5I+3HA07H3DmQA6UBzIA1YH2KsIiL1YuDAgWRnZwPQvXt3unTpQkFBwUGPOdgU5cecdhEjz76kQU9R3gNYHbedD4ysrKGZ9QGygOkA7v6Rmb0FrAMM+LO7L6zkuOuA6wB69+5dp8GLSCP1r9tJXzUjeH+wWWe/nBf8mci4xWFHw/m/PeRQZs6cSXFxMf3796+yTXVTlC/6eBrp6ensaXFYg52ivLIxBq+i7VhgkruXApjZAOBIoGfs8zfM7FR3f3e/k7lPACYA5OTkVHVuEZGks27dOq6++mr+/ve/k5JSdZGnuinKv3PjbQ1+ivJ8oFfcdk9gbRVtxwI/itseA3zs7oUAZvYv4Hjg3UqOFRFJ3Pm/pbjCfEqVCnEdku3bt3PhhRfy61//utqxhaYwRfksINvMsswsnSAhTKnYyMwOBzoA8ctRrQJOM7NmZpZGMLh9QBlKGq/cddv2rQMh0pgUFxczZswYvvWtb3HFFVdU277RT1Hu7iXADcA0gh/6ie6ea2bjzeziuKbjgGfcPb6MNAlYBswH5gJz3f3lsGIVEakvEydO5N133+Xxxx/fd3vsnDlzqmzfJKYod/epwNQK++6qsH1PJceVAteHGZuISH0qn6L8qquu4qqrrqqynaYoFzkE5mWkUgplpZCSGnU40hQ1gjXT65KShSSPslL44j2Y/xyH711IKmXwq07Quiu06QZtu8f+7AZtuu//Z/M2UUcv0qgpWUi03GHtpzB/EiyYDIXrIb0N21Pasdta0O2kb8L2dbBjLWxaFiST3ZUMfKe3iSWP+KRSIbm07qJeShPm7jTlWYP2HxY+dEoWEo2Nn8P854LX5uWQmg4Dz4Ojr4Dsc1n74DkAdDvz5wceW1wEO9bB9rWV/7niPSj8EspK9j/OUoNeSpVJJfZn89b18Bcg9SkjI4NNmzaRmZnZJBOGu7Np0yYyMjJqfA4lC6k/29cGvYf5z8G6uWApkHUqnPKfcMRF0KJ9YudJbwmZ/YNXVcrKYGdB0CMp75lsX/dVUtm0NEgqeyrppTRvW0m5q0JSadW52l7KruJSPl21hVd3n8wu0ukxbTEZaSlkpKXSPC2VjGbB++AVe98sNa7NV/vSUq1J/sjVlZ49e5Kfn79vWo29274EIG1rw3+WN9FrycjI2PcwX00oWUi4ijbDwilBmemL9wGHHsfCqN/C4DHQ5rBwvjclBdp0DV7dh1fdbk8h7PiykqQS+3PjO8HnweQCcedvFjeWEiSVPS27snxPW+ZubcH7G9J598tmbC9tTgonkU4JxW8vpayGv00pxleJpVlcwklL2S/BlCee5s0qJqEKn1dITBn7nSuV5s1SSElpPMkpLS2NrKysfdu5930fgCPvPPAOo4amvq5FyULqXnERLPlXkCA+fwPK9kJmNpxxJxx12cF7BPWteWtoPgA6Dai6TVkpFG44oHdSvHUNhQWrKFsxj5Z73qSl7+JIgnlqxgKkwd6WbSnZW4yb0aL7INyDkkCZO2X73lPp9v7vy9vE3pc4ZXsrHF8GTtwxZV7l/Drx9sReFftYZpBiQY8mJfY+Ze9uDGfJr4+r2d93kkgt3gXQ4K8DgmvZSIK98lpQsoBQH+tvMkr3wvK3gxLTolehuDAo4Rz/g2Ac4rAhwa9PQ5SSCm27sbVZJjO39mDGhs3MWLGJvLXbKXNIT01haK92nNw7g5O6FHNUm51k7AqSS9r2deya/SxGGdaiw74J0+prmL08yZS6U1b2VSIpLfsqYZWVxT6PJZzKPi9zp6QM9u7dggPNmrWrpysIR0lxkEYb+nVAcC0lFv5PuZKF1FxZGeTPDBJE7gtQtAky2ge9h6OvgD4nBeWgBmpT4R5mrtjMjBWb+Xj5Jhav34E7NG+WwvDe7bnxzGxG9uvIMb07kJFW9c//6rnBQjSDr5pcX6HvYwSJqa6SU+59JwMw+PY36+iM0Wgs1wHBtXSmpPqGtaRkIYdufW7sTqbJsG0VNGsBh58fJIgBZ0Gz5lFHWCMbduxmxvKg1zBj+WY+3xA8cdsiLZVj+3TgwqO7MbJfJkN7taN5M92CK02LkoUkZstKWDApGIfYkBfchtr/TDjz53DEBQ3yobh123btlxyWb9wJQKv0VHL6dmTMMT0YmZXJ0T3akd6s4faQROqCkoVUrbAA8l4MehGrY4vF9DoeLvhdcCdTq07RxneIVm8uYsaKzcxYvokZKzazanMRAG0ymjGib0fGjujFyKxMBndvS7NUJQeReEoWsr89O4IB6vnPwbK3gltGuwyGs+4OxiI69Ik6woS4Oys3Fe3rNcxYsZk1W4M7YNq3TGNE3458+8S+jMzqyJHd2pLaiG4TFQmDkoVAyR5Y+maQIBa/BiW7oF1vOOkmOPpy6Do46gir5e4sK9gZlxw2sX77HgAyW6Uzsl9Hrju1HyP7dWRglzaN6hkCkfqgZNFUlZXCyg+CBJH3UjDfUstMGH5VMFDda0RS3+paVuZ8vqFwv57DxsIgOXRp05yR/TIZmdWR4/t1pH/n1nr6WaSWlCyaEvdgmo35z8GC54OHzNJbB1NtHH0F9DsNUtOijrJSZWXOwi+37+s1zFyxmS1FewHo3i6DU7I7MTKrIyP7ZdI3s6WSg0gdU7JoCjYtC+5imv8cbPocUtIg+1w4+l4YOCqYaynJlDksKzuMD99dvi85bN8d3Eveq2MLzjqya6znkEnPDi2UHERCpmTRWO34Mug9zH8umAIcg74nw4k3wqCLoUWHqCM8qN/vupi3SwbD1IVkdWrFBUd3Y2S/jozMyqR7+xZRhyfS5ISaLMxsFPBHggdIH3X331b4/CHgjNhmS6CLu7ePfdYbeBToBThwgbt/EWa8DV5ZCRRthL9fDCveBRy6DYNz74WjLg1mS20AXp23jrdLBjMmfQa333wnXdvWfFplEakboSULM0sFHgbOAfKBWWY2xd3zytu4+0/i2t8IxE8P+gRwr7u/YWatgbKwYm3Q3GHVR/Dpk8HUG14WvE67LbiTqVN21BEekk2Fe7jrpQVkp6zj2uZv0bXt+KhDEhHC7VmMAJa6+3IAM3sGGA3kVdF+HHB3rO0goJm7vwHg7oUhxtkw7VgPc/8Jn/0jWJshvQ206hJMm339O0l9J9PB3PNyHtt372V8i1dItYa/1oBIYxFmsugBrI7bzgdGVtbQzPoAWcD02K6BwFYzez62/03gdveKiwo0MaUl8Pnr8NmTsGRa8MBc7xPg5J/C4Evgqa8H7RpoonhtwZe8PHct/3nOQPrO2Bh1OCISJ8xkUdkvVlX/VBwLTIpLBs2AUwjKUquAZ4FrgL/u9wVm1wHXAfTu3bv2ESerjUuDBDH36WCN6lZd4MQbYPjVDa7MVJUtO4v5+YsLGNy9LT84vT9LZkQdkYjECzNZ5BMMTpfrCaytou1Y4EcVjv0sroT1InA8FZKFu08AJgDk5OQ0rppF8c7gYblPn4RVHwYT9w08L3hoLvvcpH0eoqbGv5LH1qJinvjOCNI0L5NI0gkzWcwCss0sC1hDkBCurNjIzA4HOgAfVTi2g5l1dvcC4ExgdoixJgd3WPMpfPZEMP138Q7o2B/OvgeGjgtvCdKIvZm3nhc+W8NNZ2UzqHvbqMMRkUqElizcvcTMbgCmEdw6+5i755rZeGC2u0+JNR0HPOPuHndsqZndDPzbgqetPgH+Elaskdu5CeY9G5SaNuQF60MMviQoM/U5scGOQSRiW9Fe7nxhPkcc1oYfnXGQpU1FJFKhPmfh7lOBqRX23VVh+54qjn0DGBJacFErK4XlbwVlpsVTobQYuh8DFz0UzO6a0fCXe0zEr17NY9POYh675jitGSGSxPQEd33bshLmPAWfPQXb84MnqXO+C8dc3SBmd61Lby3ewKRP8rnhjAEc1WP/5Dg+80EguLNBRKKnZFEf9u6GRa8EZabl7wT7+p8B5/4KjriwwS5DWhvbd+/ljsnzGdi1NTeepfKTSLJTsgjTl/ODMtP8ibBrS7BGxOm3w7AroX0jvtU3Afe9upANO3bzyNUnaT1rkQZAyaKu7doarFX96ZOwbg6kpgdTgB9zNWSdDimqy7+7pIBnZq3mB6f1Z2iv9lGHE7rB3ZrG+JM0bkoWdcEdvng/KDPlvQQlu6HrUTDqfhjydWjZMeoIk0bhnhLueH4+/Tu34sdnN44HCkWaAiWL2ti+LjZY/Q/YsgKatw1KTMOvhu7DG/UtrzX1m6kLWbttF5N+cCIZaSo/iTQUShaHqnQvLHktKDMtfSOY4bXPycFYxJEXJ+VCQsniw6UbeWrGKr5/ShbH9knu9TREZH9KFokqWBI8WT33GdhZAK0Pg5NuCnoRmf2jji7p7dxTwq2T55HVqRX/ee7hUYdTv659NeoI6szgO9+POoQ60ViuA+rvWpQsDmZPIeS+EIxFrJ4Rm59pVDBYPeAcSNVfX6IeeG0Ra7buYuL1J6j8JNIA6deuInfInwWfPhEkiuJCyBwAZ/8yNj9T16gjbHA+Xr6Jv3+0kmtP6stxfTXYL9IQKVmUK90LH/456EUULIK0ljB4TFBm6n28BqtraFdxKbdNnkfvji255bwmVn4SaUSULLavg4KFULQZ8mdAjxz42h9h8KWQoRlQa+vBaYtZuamIp79/PC3TE//P7dnrTwgxKhE5VEoWLdoHa0e06QZXPw9djow6okZj9heb+duHK7j6+D6c0D8z6nBEpBaULNJaQPdjgzKTEkWd2b23lFsnzaNH+xbcfv4RUYcjIrWkZAEajwjBH95YwvKNO3nqeyNp1Vz/mYk0dJqoSOrcp6u28Oh7yxk3ojcnDegUdTgiUgeULKRO7d5byi3PzeWwthnceYHKTyKNheoDUqf++O/PWVawk79/ZwRtMtKiDkdE6oh6FlJn5q7eyiPvLOPrOT05bWDnqMMRkToUarIws1FmttjMlprZ7ZV8/pCZzYm9lpjZ1gqftzWzNWb25zDjlNrbU1LKLZPm0qVNBj+7cFDU4YhIHQutDGVmqcDDwDlAPjDLzKa4e155G3f/SVz7G4HhFU7zK+CdsGKUuvPn6UtZsr6Qv11zHO1aqPwk0tiE2bMYASx19+XuXgw8A4w+SPtxwNPlG2Z2LNAVeD3EGKUOLFizjf95exmXHtODM47oEnU4IhKCMJNFD2B13HZ+bN8BzKwPkAVMj22nAL8HbjnYF5jZdWY228xmFxQU1EnQcmiKS8q4ZdI8Mlulc/dFg6MOR0RCEmayqOxJN6+i7VhgkruXxrZ/CEx199VVtA9O5j7B3XPcPadzZw2oRuF/3l7KwnXbuXfM0bRrqfKTSGMV5q2z+UCvuO2ewNoq2o4FfhS3fQJwipn9EGgNpJtZobsfMEgu0Vm4bjt/nr6U0cO6c84gTd0u0piFmSxmAdlmlgWsIUgIV1ZsZGaHAx2Aj8r3ufs34z6/BshRokgue0vLuGXSXNq3TOOer6n8JNLYhVaGcvcS4AZgGrAQmOjuuWY23swujms6DnjG3asqUUkSeuSdZSxYs51fX3IUHVqlRx2OiIQs1Ce43X0qMLXCvrsqbN9TzTkeBx6v49CkFpas38Gf/r2UC4d0Y9RR3aIOR0TqgZ7glkNSUlrGLc/NpXVGM8ZfrPKTSFOhuaHkkPzlvRXMzd/Gn68cTmbr5lGHIyL1JKGehZkdFXYgkvyWbijkoTeXMGrwYVx4tMpPIk1JomWo/zOzmWb2QzNrH2pEkpRKy5xbJs2lZXoqv7rkKEwLRok0KQklC3c/GfgmwXMTs83sn2Z2TqiRSVJ57P0VfLZqK7+8eDCd26j8JNLUJDzA7e6fAz8HbgNOA/5kZovM7NKwgpPksLygkN+9vpizj+zKxUO7Rx2OiEQg0TGLIWb2EMHzEmcCX3P3I2PvHwoxPolYWZlz2+R5NG+Wwn1jVH4SaaoSvRvqz8BfgDvdfVf5Tndfa2Y/DyUySQp//+gLZn2xhd9fMZQubTOiDkdEIlJtsoitS7Ha3Z+s7POq9ksErn21Tk+3ctNO7n9tEWcc3plLj6l0wmARaSKqLUPFZoLNNDPN6dCElJU5t06aR1pKCvdderTKTyJNXKJlqJXAB2Y2BdhZvtPd/xBKVFIj33gkmIvx2etPqPW5npqxkhkrNvPAZUPo1q5Frc8nIg1boslibeyVArQJLxxJBqs3F/Gbfy3i1IGduSKnZ9ThiEgSSChZuPsvww5EkoO7c/vz80gx4zcqP4lITELJwsw6A7cCg4F9t8S4+5khxSUReXrmaj5Yuol7xxxFj/YqP4lIINGH8p4CFhGsk/1L4AuCxY2kEVmzdRf3TV3Iif0zuXJE76jDEZEkkmiyyHT3vwJ73f0dd/8OcHyIcUk9c3dunzyPMnfuv2yIyk8isp9EB7j3xv5cZ2YXEgx2N56Rzzp+PqEhem52Pu99vpHxowfTq2PLqMMRkSSTaLL4tZm1A/4T+G+gLfCT0KKSerVu2y5+9UoeI7M6ctXIPlGHIyJJKNG7oV6Jvd0GnJHoyc1sFPBHIBV41N1/W+Hzh+LO1xLo4u7tzWwY8L8ESakUuNfdn030eyVx7s6dz8+npMx54PIhpKSo/CQiB0r0bqi/AV5xf2zsoqpjUoGHgXOAfGCWmU1x97y4438S1/5GYHhsswj4lrt/bmbdgU/MbJq7b00kXknc85+u4a3FBdx10SD6ZLaKOhwRSVKJlqFeiXufAYwhGLc4mBHAUndfDmBmzwCjgbwq2o8D7gZw9yXlO2OTFW4AOgNKFnVo/fbd/PLlXI7r24FrTuwbdTgiksQSLUNNjt82s6eBN6s5rAewOm47HxhZWUMz60NwW+70Sj4bAaQDyxKJVRLj7vzshQXsKSnjgcuHqvwkIgeV8OJHFWQD1d2IX9mvzwGlrJixwKTYpIVfncCsG/AkcK27lx3wBWbXmdlsM5tdUFCQQNhSbsrctby5cD03n3s4WZ1UfhKRg0t08aMdZra9/AW8TLBi3sHkEyzDWq4nVZeuxgJPV/jOtsCrwM/d/ePKDnL3Ce6e4+45nTt3TuRSBCjYsYe7p+QyvHd7vnNyVtThiEgDkGgZqiaTB84Css0sC1hDkBCurNjIzA4HOgAfxe1LB14AnnD352rw3VIFd+cXLy6gqLiUBy8fSqrKTyKSgER7FmNiz1mUb7c3s0sOdoy7lwA3ANMIlmOd6O65ZjbezC6OazoOeMbd40tUXwdOBa4xszmx17AEr0kO4tX563gt90t+cvZABnRpHXU4ItJAJHo31N3u/kL5hrtvNbO7gRcPdpC7TwWmVth3V4Xteyo57h/APxKMTRK0qXAPd72Uy9Ce7fj+KSo/iUjiEh3grqxdoolGksRdU3Ip3F3CA5cPpVlqTe9tEJGmKNFfjNlm9gcz629m/WJPXn8SZmBSt15bsI5X563jP84awOGHaf0qETk0iSaLG4Fi4FlgIrAL+FFYQUnd2rKzmJ+/uIDB3dty/Wn9ow5HRBqgRO+G2gncHnIsEpJ7Xs5la9FenvzuSNJUfhKRGkj0bqg3zKx93HYHM5sWXlhSV97IW89Lc9Zyw5kDOLJb26jDEZEGKtF/ZnaKn8TP3bcAXcIJSerK1qJi7nxhPkcc1oYfnj4g6nBEpAFLNFmUmdm+6T3MrC9VT90hSWL8K3ls3lnM764YSnozlZ9EpOYSvf31Z8D7ZvZObPtU4LpwQpK6MH3Rep7/dA03njmAo3q0q/4AEZGDSHSA+zUzyyFIEHOAlwjuiJIktG3XXu58fgEDu7bmhjNVfhKR2kt08aPvATcRTAY4BzieYC6nM8MLTWrq3lfzKCjcw4RvHUvzZqlRhyMijUCiheybgOOAle5+BsGKdpoTPAltLSpm4ux8rju1H0N6tq/+ABGRBCSaLHa7+24AM2vu7ouAw8MLS2qipMxZsbGIAV1ac9NZ2VGHIyKNSKID3Pmx5yxeBN4wsy1Uv6yq1LPVm4soLi3jgcuHkJGm8pOI1J1EB7jHxN7eY2ZvAe2A10KLSg7ZB0s3smHHHrq1y+CY3h2iDkdEGplDnjnW3d+pvpXUp517Srht8jwy0lLo2b5F1OGISCOkJ7UagftfW8Sarbvo16kVKVr5TkRCoGTRwH20bBNPfLSSa0/Mok1GWtThiEgjpWTRgBUVB+WnPpktueU83ZwmIuEJNVmY2SgzW2xmS83sgCnOzeyhuDW2l5jZ1rjPvm1mn8de3w4zzobqwWmLWbW5iPsvG0KLdN39JCLhCW1pVDNLBR4GzgHygVlmNsXd88rbuPtP4trfSPCwH2bWEbgbyCGYsPCT2LFbwoq3oZn1xWYe//ALvn1CH47vlxl1OCLSyIXZsxgBLHX35e5eDDwDjD5I+3HA07H35wFvuPvmWIJ4AxgVYqwNyq7iUm6dNI+eHVpw66gjog5HRJqAMJNFD2B13HZ+bN8BzKwPkAVMP9Rjm6I/vLGYFRt3cv+lQ2jVPLTOoYjIPmEmi8ru4axqDYyxwCR3Lz2UY83sOjObbWazCwqaxlRVn6zcwl/fX8E3R/bmxAGdog5HRJqIMJNFPtArbrsnVU8RMpavSlAJH+vuE9w9x91zOnfuXMtwk9/uvaXcOmku3dq14I4Ljow6HBFpQsJMFrOAbDPLMrN0goQwpWIjMzsc6EAw5Xm5acC5sbW+OwDnxvY1af/15ucsK9jJby49mtYqP4lIPQrtF8fdS8zsBoIf+VTgMXfPNbPxwGx3L08c44Bn3N3jjt1sZr8iSDgA4919c1ixNgRzV29lwrvL+EZOL04d2Ph7USKSXEL956m7TwWmVth3V4Xte6o49jHgsdCCa0D2lJRy83Nz6do2g59dpPKTiNQ/1TIagP/+91I+31DI3649jraa0kNEIqDpPpLcgjXb+N93lnHZMT054/AuUYcjIk3PcatYAAAOMElEQVSUkkUSKy4p4+bn5pLZKp27LhoUdTgi0oSpDJXEHn5rKYu+3MGj38qhXUuVn0QkOupZJKm8tdt5+K2lXDKsO2cP6hp1OCLSxClZJKG9pUH5qX3LdO7+2uCowxERURkqGf3f28vIW7ed/7vqWDq0So86HBER9SySzeIvd/Cn6Z9z0ZBujDrqsKjDEREBlCySSklpGbdMmkvbjDR+ebHKTyKSPFSGSiIT3lvOvPxtPHzlMWS2bh51OCIi+6hnkSSWbtjBf73xOecfdRgXDukWdTgiIvtRskgCpWXOzc/No1XzVMaPPirqcEREDqAyVBL46/vLmbN6K38cO4zObVR+EpHko55FxJYXFPL715dwzqCuXDy0e9ThiIhUSskiQqVlzq2T5pGRlsq9lxyFWWWryYqIRE9lqAg9/uEXzF65hT98fShd2mbU+nzPXn9CHUQlInIg9Swi8sXGnTw4bRFnHtGFMcN7RB2OiMhBKVlEoKzMuXXyPNJSU7hvzNEqP4lI0lOyiMA/Zqxk5orN/OKiQRzWrvblJxGRsIWaLMxslJktNrOlZnZ7FW2+bmZ5ZpZrZv+M2/9AbN9CM/uTNZJ/fq/eXMRv/7WIUwd25opje0YdjohIQkIb4DazVOBh4BwgH5hlZlPcPS+uTTZwB3CSu28xsy6x/ScCJwFDYk3fB04D3g4r3vrg7tw2eR4pZvz2UpWfRKThCLNnMQJY6u7L3b0YeAYYXaHN94GH3X0LgLtviO13IANIB5oDacD6EGOtF/+cuYoPl23izguOpHv7FlGHIyKSsDCTRQ9gddx2fmxfvIHAQDP7wMw+NrNRAO7+EfAWsC72mubuCyt+gZldZ2azzWx2QUFBKBdRV/K3FHHfqws5eUAnxo3oFXU4IiKHJMxkUVmNxStsNwOygdOBccCjZtbezAYARwI9CRLMmWZ26gEnc5/g7jnuntO5c+c6Db4uuTt3PD8fB36j8pOINEBhJot8IP6f0D2BtZW0ecnd97r7CmAxQfIYA3zs7oXuXgj8Czg+xFhDNXH2at77fCN3nH8EvTq2jDocEZFDFmaymAVkm1mWmaUDY4EpFdq8CJwBYGadCMpSy4FVwGlm1szM0ggGtw8oQzUE67bt4tevLOT4fh355sg+UYcjIlIjoSULdy8BbgCmEfzQT3T3XDMbb2YXx5pNAzaZWR7BGMUt7r4JmAQsA+YDc4G57v5yWLGGpbz8VFLmPHDZUFJSVH4SkYYp1Lmh3H0qMLXCvrvi3jvw09grvk0pcH2YsdWHyZ+u4e3FBdz9tUH0zlT5SUQaLj3BHZL123cz/uVcRvTtyLdP6Bt1OCIitaJkEQJ352cvzGdPSRn3Xz5E5ScRafCULELw0py1vLlwA7ecdzhZnVpFHY6ISK0pWdSxDTt2c8/LuRzTuz3XnpQVdTgiInVCyaIOuTu/eHEBRcWlPHD5UFJVfhKRRkLJog69Mm8d03LX89NzBjKgS+uowxERqTNKFnVkY+Ee7p6Sy9Ce7fjeySo/iUjjomRRR+5+KZfC3SU8eMVQmqXqr1VEGhf9qtWBf81fx6vz13HT2dkM7Nom6nBEROqckkUtbd5ZzC9eWsBRPdpy3an9og5HRCQUoU730RTcMyWXbbv28uR3R5Km8pOINFL6dauF13O/ZMrctdxwRjZHdmsbdTgiIqFRsqihrUXF/OzFBRzZrS0/PKN/1OGIiIRKZagaGv9KHlt2FvP4tcep/CQijZ5+5Wpg+qL1PP/pGn54en8Gd28XdTgiIqFTsjhE23bt5Y7n53N41zbccGZ21OGIiNQLlaEO0b2v5rGxsJi/fCuH9GbKtSLSNOjX7hC8vXgDE2fnc/2p/RjSs33U4YiI1JtQk4WZjTKzxWa21Mxur6LN180sz8xyzeyfcft7m9nrZrYw9nnfMGOtzo7dQflpQJfW/MdZKj+JSNMSWhnKzFKBh4FzgHxglplNcfe8uDbZwB3ASe6+xcy6xJ3iCeBed3/DzFoDZWHFmoj7pi5i/fbdTP5/J5KRlhplKCIi9S7MnsUIYKm7L3f3YuAZYHSFNt8HHnb3LQDuvgHAzAYBzdz9jdj+QncvCjHWg3r/8408PXMV3z+lH8N7d4gqDBGRyISZLHoAq+O282P74g0EBprZB2b2sZmNitu/1cyeN7PPzOzBWE+l3hXuKeG2yfPo16kVPzlnYBQhiIhELsxkUdkycV5huxmQDZwOjAMeNbP2sf2nADcDxwH9gGsO+AKz68xstpnNLigoqLvI49z/r0Ws3baLB68YovKTiDRZYSaLfKBX3HZPYG0lbV5y973uvgJYTJA88oHPYiWsEuBF4JiKX+DuE9w9x91zOnfuXOcX8OGyjTz58Uq+c1IWx/bpWOfnFxFpKMJMFrOAbDPLMrN0YCwwpUKbF4EzAMysE0H5aXns2A5mVp4BzgTyqEdFxSXcPnk+fTNbcvO5h9fnV4uIJJ3QkkWsR3ADMA1YCEx091wzG29mF8eaTQM2mVke8BZwi7tvcvdSghLUv81sPkFJ6y9hxVqZB15bzKrNRdx/2RBapKv8JCJNm7lXHEZomHJycnz27Nl1cq6ZKzbzjQkf8e0T+nLPxYPr5JwiIsnIzD5x95zq2ukJ7gp2FZdy66S59OzQgltHqfwkIgKaG+oAv399MV9sKuKf3x9Jy3T99YiIgHoW+/lk5Wb++sEKvjmyNyf27xR1OCIiSUPJImb33lJumTSP7u1acMcFR0YdjohIUlGdBfjGIx+xanMR67bt5snvjqB1c/21iIjEU8+CYEqPddt2M/a4XpySXfcP94mINHRNPlnsKSllecFO0lNTuPNClZ9ERCrT5JPFhu17AMjq1JK2GWkRRyMikpyafHG+V8eWHN2jLWaVzXsoIiKgngWAEoWISDWafM8C4NnrT4g6BBGRpKaehYiIVEvJQkREqqVkISIi1VKyEBGRailZiIhItZQsRESkWkoWIiJSLSULERGplpKFiIhUy9w96hjqhJkVACtrcYpOwMY6CidKjeU6QNeSrBrLtTSW64DaXUsfd692bYZGkyxqy8xmu3tO1HHUVmO5DtC1JKvGci2N5Tqgfq5FZSgREamWkoWIiFRLyeIrE6IOoI40lusAXUuyaizX0liuA+rhWjRmISIi1VLPQkREqqVkEWNmvzKzeWY2x8xeN7PuUcdUU2b2oJktil3PC2bWPuqYasrMrjCzXDMrM7MGd+eKmY0ys8VmttTMbo86ntows8fMbIOZLYg6ltows15m9paZLYz9t3VT1DHVlJllmNlMM5sbu5ZfhvZdKkMFzKytu2+Pvf8PYJC7/yDisGrEzM4Fprt7iZndD+Dut0UcVo2Y2ZFAGfAIcLO7z444pISZWSqwBDgHyAdmAePcPS/SwGrIzE4FCoEn3P2oqOOpKTPrBnRz90/NrA3wCXBJQ/zfxYI1oVu5e6GZpQHvAze5+8d1/V3qWcSUJ4qYVkCDzaLu/rq7l8Q2PwZ6RhlPbbj7QndfHHUcNTQCWOruy929GHgGGB1xTDXm7u8Cm6OOo7bcfZ27fxp7vwNYCPSINqqa8UBhbDMt9grlt0vJIo6Z3Wtmq4FvAndFHU8d+Q7wr6iDaKJ6AKvjtvNpoD9KjZWZ9QWGAzOijaTmzCzVzOYAG4A33D2Ua2lSycLM3jSzBZW8RgO4+8/cvRfwFHBDtNEeXHXXEmvzM6CE4HqSViLX0kBZJfsabI+1sTGz1sBk4McVKgsNiruXuvswggrCCDMLpUTYLIyTJit3PzvBpv8EXgXuDjGcWqnuWszs28BFwFme5ANTh/C/S0OTD/SK2+4JrI0oFokTq+9PBp5y9+ejjqcuuPtWM3sbGAXU+U0ITapncTBmlh23eTGwKKpYasvMRgG3ARe7e1HU8TRhs4BsM8sys3RgLDAl4piavNig8F+Bhe7+h6jjqQ0z61x+t6OZtQDOJqTfLt0NFWNmk4HDCe68WQn8wN3XRBtVzZjZUqA5sCm26+MGfGfXGOC/gc7AVmCOu58XbVSJM7MLgP8CUoHH3P3eiEOqMTN7GjidYIbT9cDd7v7XSIOqATM7GXgPmE/w/3eAO919anRR1YyZDQH+TvDfVwow0d3Hh/JdShYiIlIdlaFERKRaShYiIlItJQsREamWkoWIiFRLyUJERKqlZCFyCMyssPpWBz1+kpn1i71vbWaPmNmy2Iyh75rZSDNLj71vUg/NSnJTshCpJ2Y2GEh19+WxXY8STMyX7e6DgWuATrFJB/8NfCOSQEUqoWQhUgMWeDA2h9V8M/tGbH+Kmf1PrKfwiplNNbPLY4d9E3gp1q4/MBL4ubuXAcRmp3011vbFWHuRpKBurkjNXAoMA4YSPNE8y8zeBU4C+gJHA10Ipr9+LHbMScDTsfeDCZ5GL63i/AuA40KJXKQG1LMQqZmTgadjM36uB94h+HE/GXjO3cvc/UvgrbhjugEFiZw8lkSKY4vziEROyUKkZiqbfvxg+wF2ARmx97nAUDM72P8HmwO7axCbSJ1TshCpmXeBb8QWnukMnArMJFjW8rLY2EVXgon3yi0EBgC4+zJgNvDL2CyomFl2+RoeZpYJFLj73vq6IJGDUbIQqZkXgHnAXGA6cGus7DSZYB2LBQTrhs8AtsWOeZX9k8f3gMOApWY2H/gLX613cQbQ4GZBlcZLs86K1DEza+3uhbHewUzgJHf/MrbewFux7aoGtsvP8TxwRwNef1waGd0NJVL3XoktSJMO/CrW48Ddd5nZ3QTrcK+q6uDYQkkvKlFIMlHPQkREqqUxCxERqZaShYiIVEvJQkREqqVkISIi1VKyEBGRailZiIhItf4/OzXibm6mXHwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# CV误差曲线\n",
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n",
    "\n",
    "#results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "\n",
    "for i,value in enumerate(penaltys):\n",
    "    pyplot.errorbar(x_axis,test_scores[:,i],yerr = test_stds[:,i],label = penaltys[i] + 'Test')\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('accuary')\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png')\n",
    "pyplot.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
